package tech.heptagram.staff.api.v3;


import com.github.pagehelper.PageInfo;

import java.util.List;

import tech.heptagram.core.common.rest.ResponseResult;
import tech.heptagram.staff.model.Staff;
import tech.heptagram.staff.model.StaffAuthException;
import tech.heptagram.staff.query.StaffQuery;
import tech.heptagram.staff.query.StaffRemoveReq;
import tech.heptagram.staff.query.StaffSaveReq;

/**
 * 新版StaffApi
 *
 * @author wang.yuchuan
 * @date 2018/6/25
 */
public interface StaffApi {

    /**
     * 保存新员工
     *
     * @param staffSaveReq 新员工参数
     * @return 员工编码
     */
    ResponseResult<String> save(StaffSaveReq staffSaveReq);

    /**
     * 修改员工信息
     *
     * @param updateStaffReq
     * @return
     */
    ResponseResult update(StaffSaveReq updateStaffReq);

    /**
     * 员工账号认证
     *
     * @param account  账号, 一般是员工手机号
     * @param password 密码
     * @return 认证成功, 返回员工对象, 否则会抛出异常
     * @throws StaffAuthException 认证异常
     */
    ResponseResult<Staff> auth(String account, String password) throws StaffAuthException;

    /**
     * 更新员工花名
     */
    ResponseResult updateStaffNickname(Staff staff);

    /**
     * 查询所有符合条件的员工列表, 分页显示
     *
     * @param staffQuery
     * @return
     */
    ResponseResult<PageInfo<Staff>> findStaffsWithPage(StaffQuery staffQuery);

    /**
     * 查询所有符合条件的员工列表, 不分页
     *
     * @param staffQuery
     * @return
     */
    ResponseResult<List<Staff>> findStaffs(StaffQuery staffQuery);

    /**
     * 获取单个员工
     *
     * @param staffQuery
     * @return
     */
    ResponseResult<Staff> getStaff(StaffQuery staffQuery);

    /**
     * 根据员工编码查询员工信息
     *
     * @param staffCode
     * @return
     */
    ResponseResult<Staff> getByCode(String staffCode);

    /**
     * 根据员工名称查询员工信息
     * 支持员工真实姓名或花名或姓名拼音
     *
     * @param staffName
     * @return
     */
    ResponseResult<Staff> getByName(String staffName);

    /**
     * 根据员工手机号查询员工信息
     *
     * 支持员工个人手机号和公司手机号
     *
     * @param mobile
     * @return
     */
    ResponseResult<Staff> getByMobile(String mobile);

    /**
     * 根据企业微信用户Id获取员工信息
     *
     * @param wxUserId 企业微信id
     * @return 员工信息
     */
    ResponseResult<Staff> getByWxUserId(String wxUserId);

    ResponseResult<Staff> getByNickName(String nickName);

    /**
     * 根据钉钉ID获取员工信息
     *
     * @param dingtalkId 钉钉ID
     * @return 员工信息
     */
    ResponseResult<Staff> getByDingtalkId(String dingtalkId);

    /**
     * 更新员工状态为离职
     */
    ResponseResult updateStatus(StaffRemoveReq req);

    /**
     * 根据部门ID查询员工列表
     * @param departmentId 部门ID
     * @return 员工列表
     */
    ResponseResult<List<Staff>> getByDepartmentId(Integer departmentId);

    /**
     * 根据部门ID列表查询员工CODE列表
     * @param deptIdList 部门ID列表
     * @return 员工CODE列表
     */
    ResponseResult<List<String>> getStaffCodeListByDeptIdList(Integer[] deptIdList);
}
